package bean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;

import bean.vo.ItemOrdenCompraVO;
import bean.vo.OrdenCompraVO;

@Entity 
@Table( name = "ordenes_de_compra" )
@SuppressWarnings({"unchecked"})
public class OrdenCompra extends EntidadPersistente{
	private Integer numeroOrdenCompra;
	@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH} )
	@Cascade( org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private Proveedor proveedor;
	private Date fechaEmision;
	private boolean cumplida;
	@OneToMany (cascade = CascadeType.ALL, mappedBy = "ordenCompra")
	private List<ItemOrdenCompra> items;
	
	public OrdenCompra () {
		this.items = new ArrayList<ItemOrdenCompra>();
	}
	
	public OrdenCompra (Integer numeroOrdenCompra, Proveedor proveedor, Date fechaEmision) {
		this.numeroOrdenCompra = numeroOrdenCompra;
		this.proveedor = proveedor;
		this.fechaEmision = fechaEmision;
		this.cumplida = false;
		this.items = new ArrayList<ItemOrdenCompra>();
	}
	
	public OrdenCompraVO getVO() {
		OrdenCompraVO vo = new OrdenCompraVO();
		vo.setCumplida(cumplida);
		vo.setFechaEmision(fechaEmision);
		vo.setItems(new VOList<ItemOrdenCompraVO>().getVoList(items));
		vo.setNumeroOrdenCompra(numeroOrdenCompra);
		vo.setProveedor(proveedor != null ? proveedor.getVO() : null);
		
		return vo;
	}
	
	public Integer getNumeroOrdenCompra() {
		return numeroOrdenCompra;
	}
	
	public void setNumeroOrdenCompra(Integer numeroOrdenCompra) {
		this.numeroOrdenCompra = numeroOrdenCompra;
	}
	
	public Proveedor getProveedor() {
		return proveedor;
	}
	
	public void setProveedor(Proveedor proveedor) {
		this.proveedor = proveedor;
	}
	
	public Date getFechaEmision() {
		return fechaEmision;
	}
	
	public void setFechaEmision(Date fechaEmision) {
		this.fechaEmision = fechaEmision;
	}
	
	public boolean isCumplida() {
		return cumplida;
	}
	
	public void setCumplida(boolean cumplida) {
		this.cumplida = cumplida;
	}
	
	public List<ItemOrdenCompra> getItems() {
		return items;
	}
	
	public void setItems(List<ItemOrdenCompra> items) {
		this.items = items;
	}
	
	public void agregarItem(Producto producto, int cantidad)
	{
		ItemOrdenCompra item = new ItemOrdenCompra(this, producto, cantidad);
		
		if (!items.contains(item))
		{
			items.add(item);
		}
	}
	
	public void eliminarItem(Producto producto)
	{
		ItemOrdenCompra item = new ItemOrdenCompra(this, producto, null);
		
		if (items.contains(item))
		{
			items.remove(item);
		}
	}
	
	@Override
	public int hashCode() {
		final int primo = 31;
		int result = 1;
		result = primo * (result + (proveedor == null ? 0 : proveedor.hashCode()) + (numeroOrdenCompra == null ? 0 : numeroOrdenCompra.hashCode()));
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) return true;	
		if ((obj == null) || (!(obj instanceof OrdenCompra))) {
			return false;
		}
		
		OrdenCompra otro = (OrdenCompra) obj;
		
		boolean mismoProveedor = (proveedor!=null && otro.proveedor != null ? (proveedor.equals(otro.proveedor)) : false);
		boolean mismaOrden = (numeroOrdenCompra!=null && otro.numeroOrdenCompra != null ? (numeroOrdenCompra.equals(otro.numeroOrdenCompra)) : false);
		
		return mismoProveedor && mismaOrden;
	}
}
